package co.edu.uniquindio.pruebas;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ejb.embeddable.EJBContainer;
import javax.naming.NamingException;

import org.junit.Assert;
import org.junit.Test;

import co.edu.uniquindio.dao.AdministradorDao;
import co.edu.uniquindio.dao.AutomovilDao;
import co.edu.uniquindio.dao.ColorDao;
import co.edu.uniquindio.dao.CompradorDao;
import co.edu.uniquindio.dao.MarcaDao;
import co.edu.uniquindio.dao.ModeloDao;
import co.edu.uniquindio.dao.MotorDao;
import co.edu.uniquindio.dao.OfertaDao;
import co.edu.uniquindio.dao.PaisDao;
import co.edu.uniquindio.dao.SubastaDao;
import co.edu.uniquindio.dao.VendedorDao;
import co.edu.uniquindio.logica.Administrador;
import co.edu.uniquindio.logica.Automovil;
import co.edu.uniquindio.logica.Color;
import co.edu.uniquindio.logica.Comprador;
import co.edu.uniquindio.logica.Marca;
import co.edu.uniquindio.logica.Modelo;
import co.edu.uniquindio.logica.Motor;
import co.edu.uniquindio.logica.Oferta;
import co.edu.uniquindio.logica.Pais;
import co.edu.uniquindio.logica.Subasta;
import co.edu.uniquindio.logica.Vendedor;

/**
 * 
 * Prueba implementation class for: PruebaMagnum
 * El proposito de esta clase es el propiciar las condiciones
 * al instancias varios objetos necesarios para otras pruevas
 * futuras utilizando varias DAOs en el proceso.
 * @author Andres Felipe Abril 
 * @author Luis Enrique Robledo
 *
 */

public class PruebaMagnum 
{
	/**
	 * este atributo es un instancia de la clase AutomovilDao
	 */
	protected static AutomovilDao automovilDao;
	/**
	 * este atributo es un instancia de la clase ColorDao
	 */
	protected static ColorDao colorDao;
	/**
	 * este atributo es un instancia de la clase MarcaDao
	 */
	protected static MarcaDao marcaDao;
	/**
	 * este atributo es una instancia de la clase PaisDao 
	 */
	protected static PaisDao paisDao;
	/**
	 * este atributo es una instancia de la clase ModeloDao
	 */
	protected static ModeloDao modeloDao; 
	/**
	 * este atributo es una instancia de la clase VendedorDao
	 */
	protected static VendedorDao vendedorDao;
	/**
	 * este atributo es un instancia de la clase MotorDao
	 */
	protected static MotorDao motorDao;
	/**
	 * este atributo es una instancia de la clase SubastaDao
	 */
	protected static SubastaDao subastaDao;
	/**
	 * este atributo es una instancia de la clase OfertaDao
	 */
	protected static OfertaDao ofertaDao;
	/**
	 * este atributo es una instancia de la clase CompradorDao
	 */
	protected static CompradorDao compradorDao;
	/**
	 * contenedor en el cual se manejara la instancia del EJB que 
	 * maneja los datos que se utilizaran para la prueba
	 */
	protected static EJBContainer contenedor = null;
	/**
	 * este atributo es una instancia de la clase AdministradorDao
	 */
	protected static AdministradorDao administradorDao;
	/**
	 * Constructor de la clase PruebaMagnum el cual 
	 * configura las condiciones iniciales para hacer la prueba.
	 * @throws NamingException 
	 */
	public  PruebaMagnum() throws NamingException
	{
		Map<String,String> properties = new HashMap<String,String>();
		properties.put(EJBContainer.APP_NAME, "Subasta");
		System.out.println(EJBContainer.APP_NAME);
		if( contenedor == null ){
			contenedor = EJBContainer.createEJBContainer(properties);
			configurar();
			crear();
		}
		
	    
	}
	/**
	 *Este metodo permite especificar las rutas por las cuales esta 
	 *clase puede acceder a las clases a ser probadas como parte de
	 *la configuracion inicial antes de la prueba.
	 * @throws NamingException
	 */
	public static EJBContainer getContenedor() {
		return contenedor;
	}
	
	public static void configurar() throws NamingException
	{
		
		colorDao=(ColorDao)contenedor.getContext().lookup("java:global/Subasta/ColorDao");
		marcaDao=(MarcaDao)contenedor.getContext().lookup("java:global/Subasta/MarcaDao");
		paisDao=(PaisDao)contenedor.getContext().lookup("java:global/Subasta/PaisDao");
		modeloDao=(ModeloDao)contenedor.getContext().lookup("java:global/Subasta/ModeloDao");
	    vendedorDao=(VendedorDao)contenedor.getContext().lookup("java:global/Subasta/VendedorDao");
		motorDao=(MotorDao)contenedor.getContext().lookup("java:global/Subasta/MotorDao");
		automovilDao=(AutomovilDao)contenedor.getContext().lookup("java:global/Subasta/AutomovilDao");
		subastaDao=(SubastaDao)contenedor.getContext().lookup("java:global/Subasta/SubastaDao");
        ofertaDao=(OfertaDao)contenedor.getContext().lookup("java:global/Subasta/OfertaDao");
        compradorDao=(CompradorDao)contenedor.getContext().lookup("java:global/Subasta/CompradorDao");
        administradorDao=(AdministradorDao)contenedor.getContext().lookup("java:global/Subasta/AdministradorDao");
	}
	/**
	 * Metodo en el cual se hacen diversas incersiones en la BD atravez de
	 * de las DAOs pertinentes para despues verificar
	 * los datos obtenidos atravez de las mismas DAOs. 
	 * @throws NamingException
	 */
	@Test
	public void crear() throws NamingException 
	{
		
		Administrador admin= new Administrador("abril", "elefantesazules");
		//administradorDao.insert(admin);
		
		Color color= new Color("Amarillo",1,12,13,5);
	//	colorDao.insert(color);

		Marca renoult= new Marca("renoult", "en perfectas condiciones");
	//	marcaDao.insert(renoult);

		Pais pais=new Pais("av123",new Date(),"colombia");
	//	paisDao.insert(pais);

		Comprador comprador1= new Comprador("555", "acd@gamail", "gustavo", pais, "pacho","mujer");
		//compradorDao.insert(comprador1);

		Modelo r4=new Modelo(renoult, "r4", "nada");
	//	modeloDao.insert(r4);

		Vendedor vendedor= new Vendedor("129","asd@hotmail","carlos",pais,"paco","hombre");
	    //vendedorDao.insert(vendedor);

		Vendedor vendedor2= new Vendedor("1234","asdfe@hotmail","carlos",pais,"miguelito","5129");
	//	vendedorDao.insert(vendedor2);

		Subasta subasta1= new Subasta(23, vendedor2, 3000000,new Date(),new Date());
	//	subastaDao.insert(subasta1);
		
		Oferta oferta1= new  Oferta(123, comprador1, subasta1, 5000000);
	//	ofertaDao.insert(oferta1);
		
		Oferta oferta2=   new Oferta(12345, comprador1, subasta1, 8000000);
	//	ofertaDao.insert(oferta2);
		
		Motor motor= new Motor(12347,4,8);
	//	motorDao.insert(motor);

		Automovil automovil=new Automovil("123tre",color,r4,vendedor,new Date(),"24 rpm",motor);

		//Prueba de insercion
	//	automovilDao.insert(automovil);
		Assert.assertEquals("123tre", automovil.getNumeroPlaca());
		//Prueba de búsqueda
		Automovil automovilRecuperado= automovilDao.findByKey(automovil.getNumeroPlaca());
		Assert.assertEquals(automovilRecuperado.getNumeroPlaca(), automovil.getNumeroPlaca());
		//Prueba actualización
		automovilRecuperado.setKilometraje("85 rpm");
		automovilRecuperado.setFecha(new Date());
	//	automovilDao.update(automovilRecuperado);
		automovil= automovilDao.findByKey(automovilRecuperado.getNumeroPlaca());
		Assert.assertEquals("123tre", automovil.getNumeroPlaca());

		//Prueba getAll
		Automovil otroAutomovil=new Automovil();
		otroAutomovil.setNumeroPlaca("124wet");
		otroAutomovil.setKilometraje("34 rpm");
		otroAutomovil.setFecha(new Date());
		otroAutomovil.setVendedor(vendedor);
	//	automovilDao.insert(otroAutomovil);
	//	List<Automovil> automoviles= automovilDao.getAll();
	//	Assert.assertTrue(automoviles.contains(otroAutomovil));
	//	Assert.assertTrue(automoviles.contains(automovil));
		//automovilDao.insert(otroAutomovil);
		List<Automovil> automoviles= automovilDao.getAll();
		//Assert.assertTrue(automoviles.contains(otroAutomovil));
		//Assert.assertTrue(automoviles.contains(automovil));

		//Prueba select
	//	automoviles=automovilDao.select("Automovil.placa='123tre'");
	//	Assert.assertTrue(automoviles.contains(otroAutomovil));
	//	Assert.assertTrue(!automoviles.contains(automovil));
		
		//Prueba de remove
	//	automovilDao.remove(automovil);
	//	automovilDao.remove(otroAutomovil);
	//	automoviles=automovilDao.getAll();
	//	Assert.assertTrue(!automoviles.contains(otroAutomovil));
	//	Assert.assertTrue(!automoviles.contains(automovil));

		
	}


}
